#!/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);