#!/usr/bin/env perl use 5.010; use utf8; use strict; use warnings; use autodie; my $j = do { package MyJObject; use overload '""' => sub { shift->to_string }; my %num_to_string = ( 1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five', 6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 0 => 'zero', ); sub new { my ( $self, $val ) = @_; my $obj = bless { _val => 0 }, ref $self ? ref $self : $self; $obj->val($val); return $obj; } sub clone { my $self = shift; return $self->new( $self->val ); } sub val { my ( $self, $val ) = @_; if (defined $val) { if ($val =~ /^\d+$/) { $self->{_val} = $val; } else { $self->{_val} = 0; } } return $self->{_val}; } sub to_string { my $self = shift; return join '-', map { $num_to_string{$_} } split //, $self->val; } sub equal_to { my ( $self, $obj ) = @_; return !$self->_compare($obj); } sub not_equal_to { my ( $self, $obj ) = @_; return !$self->equal_to($obj); } sub less_than { my ( $self, $obj ) = @_; return $self->_compare($obj) == -1; } sub greater_than { my ( $self, $obj ) = @_; return $self->_compare($obj) == 1; } sub less_than_or_equal_to { my ( $self, $obj ) = @_; return $self->less_than($obj) || $self->equal_to($obj); } sub greater_than_or_equal_to { my ( $self, $obj ) = @_; return $self->greater_than($obj) || $self->equal_to($obj); } sub _compare { my ( $self, $obj ) = @_; return $self->val <=> $obj->val; } sub debug { my $self = shift; return $self->val . ": $self"; } __PACKAGE__->new; }; say $j->debug; $j->val(13579); say $j->debug; my $i = $j->new(24680); say $i->debug; my $k = $j->clone; say $k->debug; say "$j and $k are same" if $j->equal_to($k); say "$j and $i are not same" if $j->not_equal_to($i); say "$i is greater than $j" if $i->greater_than($j);