File Coverage

blib/lib/Class/Adapter.pm
Criterion Covered Total %
statement 15 16 93.7
branch 4 6 66.6
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 26 29 89.6


line stmt bran cond sub pod time code
1             package Class::Adapter; # git description: 1a66420
2             # ABSTRACT: Perl implementation of the "Adapter" Design Pattern
3              
4             #pod =pod
5             #pod
6             #pod =head1 DESCRIPTION
7             #pod
8             #pod The C class is intended as an abstract base class for
9             #pod creating any sort of class or object that follows the I pattern.
10             #pod
11             #pod =head2 What is an Adapter?
12             #pod
13             #pod The term I refers to a I<"Design Pattern"> of the same name,
14             #pod from the famous I<"Gang of Four"> book I<"Design Patterns">. Although
15             #pod their original implementation was designed for Java and similar
16             #pod single-inheritance strictly-typed language, the situation for which it
17             #pod applies is still valid.
18             #pod
19             #pod An I in this Perl sense of the term is when a class is created
20             #pod to achieve by composition (objects containing other object) something that
21             #pod can't be achieved by inheritance (sub-classing).
22             #pod
23             #pod This is similar to the I pattern, but is intended to be
24             #pod applied on a class-by-class basis, as opposed to being able to be applied
25             #pod one object at a time, as is the case with the I pattern.
26             #pod
27             #pod The C object holds a parent object that it "wraps",
28             #pod and when a method is called on the C, it manually
29             #pod calls the same (or different) method with the same (or different)
30             #pod parameters on the parent object contained within it.
31             #pod
32             #pod Instead of these custom methods being hooked in on an object-by-object
33             #pod basis, they are defined at the class level.
34             #pod
35             #pod Basically, a C is one of your fall-back positions
36             #pod when Perl's inheritance model fails you, or is no longer good enough,
37             #pod and you need to do something twisty in order to make several APIs play
38             #pod nicely with each other.
39             #pod
40             #pod =head2 What can I do with the actual Class::Adapter class
41             #pod
42             #pod Well... nothing really. It exist to provide some extremely low level
43             #pod fundamental methods, and to provide a common base for inheritance of
44             #pod Adapter classes.
45             #pod
46             #pod The base C class doesn't even implement a way to push
47             #pod method calls through to the underlying object, since the way in which
48             #pod B happens is the bit that changes from case to case.
49             #pod
50             #pod To actually DO something, you probably want to go take a look at
51             #pod L, which makes the creation of I
52             #pod classes relatively quick and easy.
53             #pod
54             #pod =head1 METHODS
55             #pod
56             #pod The C class itself supplies only the two most common
57             #pod methods, a default constructor and a private method to access the
58             #pod underlying object.
59             #pod
60             #pod =cut
61              
62 7     7   62732 use 5.005;
  7         26  
63 7     7   27 use strict;
  7         10  
  7         107  
64 7     7   28 use Carp ();
  7         11  
  7         125  
65 7     7   27 use Scalar::Util 1.10 ();
  7         135  
  7         921  
66              
67             our $VERSION = '1.09';
68              
69              
70              
71              
72              
73             #####################################################################
74             # Constructor
75              
76             #pod =pod
77             #pod
78             #pod =head2 new $object
79             #pod
80             #pod The default C constructor takes a single object as argument and
81             #pod creates a new object which holds the passed object.
82             #pod
83             #pod Returns a new C object, or C if you do not pass
84             #pod in an object.
85             #pod
86             #pod =cut
87              
88             sub new {
89 17 50   17 1 3945 my $class = ref $_[0] ? ref shift : shift;
90 17 100       61 my $object = Scalar::Util::blessed($_[0]) ? shift : return undef;
91 8         26 return bless { OBJECT => $object }, $class;
92             }
93              
94              
95              
96              
97              
98             #####################################################################
99             # Private Methods
100              
101             #pod =pod
102             #pod
103             #pod =head2 _OBJECT_
104             #pod
105             #pod The C<_OBJECT_> method is provided primarily as a convenience, and a tool
106             #pod for people implementing sub-classes, and allows the C
107             #pod interface to provide a guaranteed correct way of getting to the underlying
108             #pod object, should you need to do so.
109             #pod
110             #pod =cut
111              
112             sub _OBJECT_ {
113 19 50   19   789 return $_[0]->{OBJECT} if ref $_[0];
114 0           Carp::croak('Class::Adapter::_OBJECT_ called as a static method');
115             }
116              
117             1;
118              
119             __END__