OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [Integration_test/] [synthetic_sim/] [perl_lib/] [Class/] [Accessor.pm] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 56 alirezamon
package Class::Accessor;
2
require 5.00502;
3
use strict;
4
$Class::Accessor::VERSION = '0.51';
5
 
6
sub new {
7
    return bless
8
        defined $_[1]
9
            ? {%{$_[1]}} # make a copy of $fields.
10
            : {},
11
        ref $_[0] || $_[0];
12
}
13
 
14
sub mk_accessors {
15
    my($self, @fields) = @_;
16
 
17
    $self->_mk_accessors('rw', @fields);
18
}
19
 
20
if (eval { require Sub::Name }) {
21
    Sub::Name->import;
22
}
23
 
24
{
25
    no strict 'refs';
26
 
27
    sub import {
28
        my ($class, @what) = @_;
29
        my $caller = caller;
30
        for (@what) {
31
            if (/^(?:antlers|moose-?like)$/i) {
32
                *{"${caller}::has"} = sub {
33
                    my ($f, %args) = @_;
34
                    $caller->_mk_accessors(($args{is}||"rw"), $f);
35
                };
36
                *{"${caller}::extends"} = sub {
37
                    @{"${caller}::ISA"} = @_;
38
                    unless (grep $_->can("_mk_accessors"), @_) {
39
                        push @{"${caller}::ISA"}, $class;
40
                    }
41
                };
42
                # we'll use their @ISA as a default, in case it happens to be
43
                # set already
44
                &{"${caller}::extends"}(@{"${caller}::ISA"});
45
            }
46
        }
47
    }
48
 
49
    sub follow_best_practice {
50
        my($self) = @_;
51
        my $class = ref $self || $self;
52
        *{"${class}::accessor_name_for"}  = \&best_practice_accessor_name_for;
53
        *{"${class}::mutator_name_for"}  = \&best_practice_mutator_name_for;
54
    }
55
 
56
    sub _mk_accessors {
57
        my($self, $access, @fields) = @_;
58
        my $class = ref $self || $self;
59
        my $ra = $access eq 'rw' || $access eq 'ro';
60
        my $wa = $access eq 'rw' || $access eq 'wo';
61
 
62
        foreach my $field (@fields) {
63
            my $accessor_name = $self->accessor_name_for($field);
64
            my $mutator_name = $self->mutator_name_for($field);
65
            if( $accessor_name eq 'DESTROY' or $mutator_name eq 'DESTROY' ) {
66
                $self->_carp("Having a data accessor named DESTROY  in '$class' is unwise.");
67
            }
68
            if ($accessor_name eq $mutator_name) {
69
                my $accessor;
70
                if ($ra && $wa) {
71
                    $accessor = $self->make_accessor($field);
72
                } elsif ($ra) {
73
                    $accessor = $self->make_ro_accessor($field);
74
                } else {
75
                    $accessor = $self->make_wo_accessor($field);
76
                }
77
                my $fullname = "${class}::$accessor_name";
78
                my $subnamed = 0;
79
                unless (defined &{$fullname}) {
80
                    subname($fullname, $accessor) if defined &subname;
81
                    $subnamed = 1;
82
                    *{$fullname} = $accessor;
83
                }
84
                if ($accessor_name eq $field) {
85
                    # the old behaviour
86
                    my $alias = "${class}::_${field}_accessor";
87
                    subname($alias, $accessor) if defined &subname and not $subnamed;
88
                    *{$alias} = $accessor unless defined &{$alias};
89
                }
90
            } else {
91
                my $fullaccname = "${class}::$accessor_name";
92
                my $fullmutname = "${class}::$mutator_name";
93
                if ($ra and not defined &{$fullaccname}) {
94
                    my $accessor = $self->make_ro_accessor($field);
95
                    subname($fullaccname, $accessor) if defined &subname;
96
                    *{$fullaccname} = $accessor;
97
                }
98
                if ($wa and not defined &{$fullmutname}) {
99
                    my $mutator = $self->make_wo_accessor($field);
100
                    subname($fullmutname, $mutator) if defined &subname;
101
                    *{$fullmutname} = $mutator;
102
                }
103
            }
104
        }
105
    }
106
 
107
}
108
 
109
sub mk_ro_accessors {
110
    my($self, @fields) = @_;
111
 
112
    $self->_mk_accessors('ro', @fields);
113
}
114
 
115
sub mk_wo_accessors {
116
    my($self, @fields) = @_;
117
 
118
    $self->_mk_accessors('wo', @fields);
119
}
120
 
121
sub best_practice_accessor_name_for {
122
    my ($class, $field) = @_;
123
    return "get_$field";
124
}
125
 
126
sub best_practice_mutator_name_for {
127
    my ($class, $field) = @_;
128
    return "set_$field";
129
}
130
 
131
sub accessor_name_for {
132
    my ($class, $field) = @_;
133
    return $field;
134
}
135
 
136
sub mutator_name_for {
137
    my ($class, $field) = @_;
138
    return $field;
139
}
140
 
141
sub set {
142
    my($self, $key) = splice(@_, 0, 2);
143
 
144
    if(@_ == 1) {
145
        $self->{$key} = $_[0];
146
    }
147
    elsif(@_ > 1) {
148
        $self->{$key} = [@_];
149
    }
150
    else {
151
        $self->_croak("Wrong number of arguments received");
152
    }
153
}
154
 
155
sub get {
156
    my $self = shift;
157
 
158
    if(@_ == 1) {
159
        return $self->{$_[0]};
160
    }
161
    elsif( @_ > 1 ) {
162
        return @{$self}{@_};
163
    }
164
    else {
165
        $self->_croak("Wrong number of arguments received");
166
    }
167
}
168
 
169
sub make_accessor {
170
    my ($class, $field) = @_;
171
 
172
    return sub {
173
        my $self = shift;
174
 
175
        if(@_) {
176
            return $self->set($field, @_);
177
        } else {
178
            return $self->get($field);
179
        }
180
    };
181
}
182
 
183
sub make_ro_accessor {
184
    my($class, $field) = @_;
185
 
186
    return sub {
187
        my $self = shift;
188
 
189
        if (@_) {
190
            my $caller = caller;
191
            $self->_croak("'$caller' cannot alter the value of '$field' on objects of class '$class'");
192
        }
193
        else {
194
            return $self->get($field);
195
        }
196
    };
197
}
198
 
199
sub make_wo_accessor {
200
    my($class, $field) = @_;
201
 
202
    return sub {
203
        my $self = shift;
204
 
205
        unless (@_) {
206
            my $caller = caller;
207
            $self->_croak("'$caller' cannot access the value of '$field' on objects of class '$class'");
208
        }
209
        else {
210
            return $self->set($field, @_);
211
        }
212
    };
213
}
214
 
215
 
216
use Carp ();
217
 
218
sub _carp {
219
    my ($self, $msg) = @_;
220
    Carp::carp($msg || $self);
221
    return;
222
}
223
 
224
sub _croak {
225
    my ($self, $msg) = @_;
226
    Carp::croak($msg || $self);
227
    return;
228
}
229
 
230
1;
231
 
232
__END__
233
 
234
=head1 NAME
235
 
236
  Class::Accessor - Automated accessor generation
237
 
238
=head1 SYNOPSIS
239
 
240
  package Foo;
241
  use base qw(Class::Accessor);
242
  Foo->follow_best_practice;
243
  Foo->mk_accessors(qw(name role salary));
244
 
245
  # or if you prefer a Moose-like interface...
246
 
247
  package Foo;
248
  use Class::Accessor "antlers";
249
  has name => ( is => "rw", isa => "Str" );
250
  has role => ( is => "rw", isa => "Str" );
251
  has salary => ( is => "rw", isa => "Num" );
252
 
253
  # Meanwhile, in a nearby piece of code!
254
  # Class::Accessor provides new().
255
  my $mp = Foo->new({ name => "Marty", role => "JAPH" });
256
 
257
  my $job = $mp->role;  # gets $mp->{role}
258
  $mp->salary(400000);  # sets $mp->{salary} = 400000 # I wish
259
 
260
  # like my @info = @{$mp}{qw(name role)}
261
  my @info = $mp->get(qw(name role));
262
 
263
  # $mp->{salary} = 400000
264
  $mp->set('salary', 400000);
265
 
266
 
267
=head1 DESCRIPTION
268
 
269
This module automagically generates accessors/mutators for your class.
270
 
271
Most of the time, writing accessors is an exercise in cutting and
272
pasting.  You usually wind up with a series of methods like this:
273
 
274
    sub name {
275
        my $self = shift;
276
        if(@_) {
277
            $self->{name} = $_[0];
278
        }
279
        return $self->{name};
280
    }
281
 
282
    sub salary {
283
        my $self = shift;
284
        if(@_) {
285
            $self->{salary} = $_[0];
286
        }
287
        return $self->{salary};
288
    }
289
 
290
  # etc...
291
 
292
One for each piece of data in your object.  While some will be unique,
293
doing value checks and special storage tricks, most will simply be
294
exercises in repetition.  Not only is it Bad Style to have a bunch of
295
repetitious code, but it's also simply not lazy, which is the real
296
tragedy.
297
 
298
If you make your module a subclass of Class::Accessor and declare your
299
accessor fields with mk_accessors() then you'll find yourself with a
300
set of automatically generated accessors which can even be
301
customized!
302
 
303
The basic set up is very simple:
304
 
305
    package Foo;
306
    use base qw(Class::Accessor);
307
    Foo->mk_accessors( qw(far bar car) );
308
 
309
Done.  Foo now has simple far(), bar() and car() accessors
310
defined.
311
 
312
Alternatively, if you want to follow Damian's I<best practice> guidelines
313
you can use:
314
 
315
    package Foo;
316
    use base qw(Class::Accessor);
317
    Foo->follow_best_practice;
318
    Foo->mk_accessors( qw(far bar car) );
319
 
320
B<Note:> you must call C<follow_best_practice> before calling C<mk_accessors>.
321
 
322
=head2 Moose-like
323
 
324
By popular demand we now have a simple Moose-like interface.  You can now do:
325
 
326
    package Foo;
327
    use Class::Accessor "antlers";
328
    has far => ( is => "rw" );
329
    has bar => ( is => "rw" );
330
    has car => ( is => "rw" );
331
 
332
Currently only the C<is> attribute is supported.
333
 
334
=head1 CONSTRUCTOR
335
 
336
Class::Accessor provides a basic constructor, C<new>.  It generates a
337
hash-based object and can be called as either a class method or an
338
object method.
339
 
340
=head2 new
341
 
342
    my $obj = Foo->new;
343
    my $obj = $other_obj->new;
344
 
345
    my $obj = Foo->new(\%fields);
346
    my $obj = $other_obj->new(\%fields);
347
 
348
It takes an optional %fields hash which is used to initialize the
349
object (handy if you use read-only accessors).  The fields of the hash
350
correspond to the names of your accessors, so...
351
 
352
    package Foo;
353
    use base qw(Class::Accessor);
354
    Foo->mk_accessors('foo');
355
 
356
    my $obj = Foo->new({ foo => 42 });
357
    print $obj->foo;    # 42
358
 
359
however %fields can contain anything, new() will shove them all into
360
your object.
361
 
362
=head1 MAKING ACCESSORS
363
 
364
=head2 follow_best_practice
365
 
366
In Damian's Perl Best Practices book he recommends separate get and set methods
367
with the prefix set_ and get_ to make it explicit what you intend to do.  If you
368
want to create those accessor methods instead of the default ones, call:
369
 
370
    __PACKAGE__->follow_best_practice
371
 
372
B<before> you call any of the accessor-making methods.
373
 
374
=head2 accessor_name_for / mutator_name_for
375
 
376
You may have your own crazy ideas for the names of the accessors, so you can
377
make those happen by overriding C<accessor_name_for> and C<mutator_name_for> in
378
your subclass.  (I copied that idea from Class::DBI.)
379
 
380
=head2 mk_accessors
381
 
382
    __PACKAGE__->mk_accessors(@fields);
383
 
384
This creates accessor/mutator methods for each named field given in
385
@fields.  Foreach field in @fields it will generate two accessors.
386
One called "field()" and the other called "_field_accessor()".  For
387
example:
388
 
389
    # Generates foo(), _foo_accessor(), bar() and _bar_accessor().
390
    __PACKAGE__->mk_accessors(qw(foo bar));
391
 
392
See L<CAVEATS AND TRICKS/"Overriding autogenerated accessors">
393
for details.
394
 
395
=head2 mk_ro_accessors
396
 
397
  __PACKAGE__->mk_ro_accessors(@read_only_fields);
398
 
399
Same as mk_accessors() except it will generate read-only accessors
400
(ie. true accessors).  If you attempt to set a value with these
401
accessors it will throw an exception.  It only uses get() and not
402
set().
403
 
404
    package Foo;
405
    use base qw(Class::Accessor);
406
    Foo->mk_ro_accessors(qw(foo bar));
407
 
408
    # Let's assume we have an object $foo of class Foo...
409
    print $foo->foo;  # ok, prints whatever the value of $foo->{foo} is
410
    $foo->foo(42);    # BOOM!  Naughty you.
411
 
412
 
413
=head2 mk_wo_accessors
414
 
415
  __PACKAGE__->mk_wo_accessors(@write_only_fields);
416
 
417
Same as mk_accessors() except it will generate write-only accessors
418
(ie. mutators).  If you attempt to read a value with these accessors
419
it will throw an exception.  It only uses set() and not get().
420
 
421
B<NOTE> I'm not entirely sure why this is useful, but I'm sure someone
422
will need it.  If you've found a use, let me know.  Right now it's here
423
for orthogonality and because it's easy to implement.
424
 
425
    package Foo;
426
    use base qw(Class::Accessor);
427
    Foo->mk_wo_accessors(qw(foo bar));
428
 
429
    # Let's assume we have an object $foo of class Foo...
430
    $foo->foo(42);      # OK.  Sets $self->{foo} = 42
431
    print $foo->foo;    # BOOM!  Can't read from this accessor.
432
 
433
=head1 Moose!
434
 
435
If you prefer a Moose-like interface to create accessors, you can use C<has> by
436
importing this module like this:
437
 
438
  use Class::Accessor "antlers";
439
 
440
or
441
 
442
  use Class::Accessor "moose-like";
443
 
444
Then you can declare accessors like this:
445
 
446
  has alpha => ( is => "rw", isa => "Str" );
447
  has beta  => ( is => "ro", isa => "Str" );
448
  has gamma => ( is => "wo", isa => "Str" );
449
 
450
Currently only the C<is> attribute is supported.  And our C<is> also supports
451
the "wo" value to make a write-only accessor.
452
 
453
If you are using the Moose-like interface then you should use the C<extends>
454
rather than tweaking your C<@ISA> directly.  Basically, replace
455
 
456
  @ISA = qw/Foo Bar/;
457
 
458
with
459
 
460
  extends(qw/Foo Bar/);
461
 
462
=head1 DETAILS
463
 
464
An accessor generated by Class::Accessor looks something like
465
this:
466
 
467
    # Your foo may vary.
468
    sub foo {
469
        my($self) = shift;
470
        if(@_) {    # set
471
            return $self->set('foo', @_);
472
        }
473
        else {
474
            return $self->get('foo');
475
        }
476
    }
477
 
478
Very simple.  All it does is determine if you're wanting to set a
479
value or get a value and calls the appropriate method.
480
Class::Accessor provides default get() and set() methods which
481
your class can override.  They're detailed later.
482
 
483
=head2 Modifying the behavior of the accessor
484
 
485
Rather than actually modifying the accessor itself, it is much more
486
sensible to simply override the two key methods which the accessor
487
calls.  Namely set() and get().
488
 
489
If you -really- want to, you can override make_accessor().
490
 
491
=head2 set
492
 
493
    $obj->set($key, $value);
494
    $obj->set($key, @values);
495
 
496
set() defines how generally one stores data in the object.
497
 
498
override this method to change how data is stored by your accessors.
499
 
500
=head2 get
501
 
502
    $value  = $obj->get($key);
503
    @values = $obj->get(@keys);
504
 
505
get() defines how data is retrieved from your objects.
506
 
507
override this method to change how it is retrieved.
508
 
509
=head2 make_accessor
510
 
511
    $accessor = __PACKAGE__->make_accessor($field);
512
 
513
Generates a subroutine reference which acts as an accessor for the given
514
$field.  It calls get() and set().
515
 
516
If you wish to change the behavior of your accessors, try overriding
517
get() and set() before you start mucking with make_accessor().
518
 
519
=head2 make_ro_accessor
520
 
521
    $read_only_accessor = __PACKAGE__->make_ro_accessor($field);
522
 
523
Generates a subroutine reference which acts as a read-only accessor for
524
the given $field.  It only calls get().
525
 
526
Override get() to change the behavior of your accessors.
527
 
528
=head2 make_wo_accessor
529
 
530
    $write_only_accessor = __PACKAGE__->make_wo_accessor($field);
531
 
532
Generates a subroutine reference which acts as a write-only accessor
533
(mutator) for the given $field.  It only calls set().
534
 
535
Override set() to change the behavior of your accessors.
536
 
537
=head1 EXCEPTIONS
538
 
539
If something goes wrong Class::Accessor will warn or die by calling Carp::carp
540
or Carp::croak.  If you don't like this you can override _carp() and _croak() in
541
your subclass and do whatever else you want.
542
 
543
=head1 EFFICIENCY
544
 
545
Class::Accessor does not employ an autoloader, thus it is much faster
546
than you'd think.  Its generated methods incur no special penalty over
547
ones you'd write yourself.
548
 
549
  accessors:
550
              Rate  Basic   Fast Faster Direct
551
  Basic   367589/s     --   -51%   -55%   -89%
552
  Fast    747964/s   103%     --    -9%   -77%
553
  Faster  819199/s   123%    10%     --   -75%
554
  Direct 3245887/s   783%   334%   296%     --
555
 
556
  mutators:
557
              Rate    Acc   Fast Faster Direct
558
  Acc     265564/s     --   -54%   -63%   -91%
559
  Fast    573439/s   116%     --   -21%   -80%
560
  Faster  724710/s   173%    26%     --   -75%
561
  Direct 2860979/s   977%   399%   295%     --
562
 
563
Class::Accessor::Fast is faster than methods written by an average programmer
564
(where "average" is based on Schwern's example code).
565
 
566
Class::Accessor is slower than average, but more flexible.
567
 
568
Class::Accessor::Faster is even faster than Class::Accessor::Fast.  It uses an
569
array internally, not a hash.  This could be a good or bad feature depending on
570
your point of view.
571
 
572
Direct hash access is, of course, much faster than all of these, but it
573
provides no encapsulation.
574
 
575
Of course, it's not as simple as saying "Class::Accessor is slower than
576
average".  These are benchmarks for a simple accessor.  If your accessors do
577
any sort of complicated work (such as talking to a database or writing to a
578
file) the time spent doing that work will quickly swamp the time spend just
579
calling the accessor.  In that case, Class::Accessor and the ones you write
580
will be roughly the same speed.
581
 
582
 
583
=head1 EXAMPLES
584
 
585
Here's an example of generating an accessor for every public field of
586
your class.
587
 
588
    package Altoids;
589
 
590
    use base qw(Class::Accessor Class::Fields);
591
    use fields qw(curiously strong mints);
592
    Altoids->mk_accessors( Altoids->show_fields('Public') );
593
 
594
    sub new {
595
        my $proto = shift;
596
        my $class = ref $proto || $proto;
597
        return fields::new($class);
598
    }
599
 
600
    my Altoids $tin = Altoids->new;
601
 
602
    $tin->curiously('Curiouser and curiouser');
603
    print $tin->{curiously};    # prints 'Curiouser and curiouser'
604
 
605
 
606
    # Subclassing works, too.
607
    package Mint::Snuff;
608
    use base qw(Altoids);
609
 
610
    my Mint::Snuff $pouch = Mint::Snuff->new;
611
    $pouch->strong('Blow your head off!');
612
    print $pouch->{strong};     # prints 'Blow your head off!'
613
 
614
 
615
Here's a simple example of altering the behavior of your accessors.
616
 
617
    package Foo;
618
    use base qw(Class::Accessor);
619
    Foo->mk_accessors(qw(this that up down));
620
 
621
    sub get {
622
        my $self = shift;
623
 
624
        # Note every time someone gets some data.
625
        print STDERR "Getting @_\n";
626
 
627
        $self->SUPER::get(@_);
628
    }
629
 
630
    sub set {
631
        my ($self, $key) = splice(@_, 0, 2);
632
 
633
        # Note every time someone sets some data.
634
        print STDERR "Setting $key to @_\n";
635
 
636
        $self->SUPER::set($key, @_);
637
    }
638
 
639
 
640
=head1 CAVEATS AND TRICKS
641
 
642
Class::Accessor has to do some internal wackiness to get its
643
job done quickly and efficiently.  Because of this, there's a few
644
tricks and traps one must know about.
645
 
646
Hey, nothing's perfect.
647
 
648
=head2 Don't make a field called DESTROY
649
 
650
This is bad.  Since DESTROY is a magical method it would be bad for us
651
to define an accessor using that name.  Class::Accessor will
652
carp if you try to use it with a field named "DESTROY".
653
 
654
=head2 Overriding autogenerated accessors
655
 
656
You may want to override the autogenerated accessor with your own, yet
657
have your custom accessor call the default one.  For instance, maybe
658
you want to have an accessor which checks its input.  Normally, one
659
would expect this to work:
660
 
661
    package Foo;
662
    use base qw(Class::Accessor);
663
    Foo->mk_accessors(qw(email this that whatever));
664
 
665
    # Only accept addresses which look valid.
666
    sub email {
667
        my($self) = shift;
668
        my($email) = @_;
669
 
670
        if( @_ ) {  # Setting
671
            require Email::Valid;
672
            unless( Email::Valid->address($email) ) {
673
                carp("$email doesn't look like a valid address.");
674
                return;
675
            }
676
        }
677
 
678
        return $self->SUPER::email(@_);
679
    }
680
 
681
There's a subtle problem in the last example, and it's in this line:
682
 
683
    return $self->SUPER::email(@_);
684
 
685
If we look at how Foo was defined, it called mk_accessors() which
686
stuck email() right into Foo's namespace.  There *is* no
687
SUPER::email() to delegate to!  Two ways around this... first is to
688
make a "pure" base class for Foo.  This pure class will generate the
689
accessors and provide the necessary super class for Foo to use:
690
 
691
    package Pure::Organic::Foo;
692
    use base qw(Class::Accessor);
693
    Pure::Organic::Foo->mk_accessors(qw(email this that whatever));
694
 
695
    package Foo;
696
    use base qw(Pure::Organic::Foo);
697
 
698
And now Foo::email() can override the generated
699
Pure::Organic::Foo::email() and use it as SUPER::email().
700
 
701
This is probably the most obvious solution to everyone but me.
702
Instead, what first made sense to me was for mk_accessors() to define
703
an alias of email(), _email_accessor().  Using this solution,
704
Foo::email() would be written with:
705
 
706
    return $self->_email_accessor(@_);
707
 
708
instead of the expected SUPER::email().
709
 
710
 
711
=head1 AUTHORS
712
 
713
Copyright 2017 Marty Pauley <marty+perl@martian.org>
714
 
715
This program is free software; you can redistribute it and/or modify it under
716
the same terms as Perl itself.  That means either (a) the GNU General Public
717
License or (b) the Artistic License.
718
 
719
=head2 ORIGINAL AUTHOR
720
 
721
Michael G Schwern <schwern@pobox.com>
722
 
723
=head2 THANKS
724
 
725
Liz and RUZ for performance tweaks.
726
 
727
Tels, for his big feature request/bug report.
728
 
729
Various presenters at YAPC::Asia 2009 for criticising the non-Moose interface.
730
 
731
=head1 SEE ALSO
732
 
733
See L<Class::Accessor::Fast> and L<Class::Accessor::Faster> if speed is more
734
important than flexibility.
735
 
736
These are some modules which do similar things in different ways
737
L<Class::Struct>, L<Class::Methodmaker>, L<Class::Generate>,
738
L<Class::Class>, L<Class::Contract>, L<Moose>, L<Mouse>
739
 
740
See L<Class::DBI> for an example of this module in use.
741
 
742
=cut

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.