Ambrosia

 view release on metacpan or  search on metacpan

lib/Ambrosia/core/Object.pm  view on Meta::CPAN

{
    my $self = shift;
    my $other = shift;
    my $deep = shift;
    my $identical = shift;

    return ($identical && int($self) == int($other))
            || (ref($self) eq ref($other) && $self->__equal($other, $deep));
}

################################################################################
sub __AMBROSIA_ATTR_ACTION__ { return {}; }

sub MODIFY_CODE_ATTRIBUTES
{
    my ($package, $subref, @attrs) = @_;

    no strict 'refs';
    no warnings 'redefine';
    my $h = $package->__AMBROSIA_ATTR_ACTION__();
    *{"${package}::__AMBROSIA_ATTR_ACTION__"} = sub { return { %$h, $subref => [$package, $subref, \@attrs] } };
    return;
}

sub FETCH_CODE_ATTRIBUTES
{
    #my ($package, $subref) = @_;
    #my $attrs = $attrs{ refaddr $subref };
    #return @$attrs;
}

1;

__END__

=head1 NAME

Ambrosia::core::Object - an abstract base class for classes that are created by Ambrosia::Meta.

=head1 VERSION

version 0.010

=head1 SYNOPSIS

    # file Foo.pm
    package Foo;
    use strict;
    
    use Ambrosia::Meta;
    class
    {
        public    => [qw/foo_pub1 foo_pub2/],
        protected => [qw/foo_pro1 foo_pro2/],
        private   => [qw/foo_pri1 foo_pri2/],
    };
    
    sub _init
    {
        my $self = shift;
        $self->SUPER::_init(@_);

        $self->foo_pub1 ||= 'foo_pub1';
        $self->foo_pub2 ||= 'foo_pub2';
        $self->foo_pri1 ||= 'foo_pri1';
        $self->foo_pri2 ||= 'foo_pri2';
        $self->foo_pro1 ||= 2;
        $self->foo_pro2 ||= 'foo_pro2';
    }
    
    sub count
    {
        shift->foo_pro1
    }
    
    1;
    
    # file Bar.pm
    package Bar;
    use strict;
    
    use Ambrosia::Meta;
    class sealed
    {
        extends   => [qw/Foo/],
        public    => [qw/bar_pub1 bar_pub2/],
        protected => [qw/bar_pro1 bar_pro2/],
        private   => [qw/bar_pri1 bar_pri2 list/],
    };
    
    sub _init
    {
        my $self = shift;

        #Ignore all input data
        $self->SUPER::_init(foo_pri1=>4);
        $self->bar_pub1 = 'bar_pub1';
        $self->bar_pub2 = 'bar_pub2';
        $self->bar_pri1 = 'bar_pri1';
        $self->bar_pri2 = 'bar_pri2';
        $self->bar_pro1 = 'bar_pro1';
        $self->bar_pro2 = 'bar_pro2';

        $self->list = [] unless defined $self->list;

        push @{$self->list}, (new Foo(foo_pub1 => 'list1.1', foo_pub2 => 'list1.2'),
                              new Foo(foo_pub1 => 'list2.1', foo_pub2 => 'list2.2')
                              );
    }

    1;

    # file test.pl

    #!/usr/bin/perl -w
    use strict;
    use Data::Dumper;
    use Bar;

    my $obj1 = new Bar;

    $obj1->foo_pub1 = 1;
    print $obj1->foo_pub1, "\n";

    use Time::HiRes qw ( time );

    my $s = 0;

    my $t1=time;

    foreach ( 1..10000 )
    {
        $s += $obj1->count;
    }
    print "time:",(time-$t1), "\n";

    print "sum=$s\n";

    $t1=time;

    foreach ( 1..10000 )
    {
        my $obj1 = Bar->new;
    }
    print "time:",(time-$t1), "\n";

    print Dumper($obj1);

    my $r;
    read STDIN, $r, 1;

    print $r;

    ############################################################################

=head1 DESCRIPTION



( run in 3.117 seconds using v1.01-cache-2.11-cpan-e93a5daba3e )