=head1 NAME

Net::LDAP::Schema - Load and manipulate an LDAP v3 Schema

=head1 SYNOPSIS

 use Net::LDAP;
 use Net::LDAP::Schema;

 #
 # Read schema from server
 #
 $ldap = Net::LDAP->new ( $server );
 $ldap->bind ( );
 $schema = $ldap->schema ( );

 #
 # Load from LDIF
 #
 $schema = Net::LDAP::Schema->new;
 $schema->parse ( "schema.ldif" ) or die $schema->error;

=head1 DESCRIPTION

C<Net::LDAP::Schema> provides a means to load an LDAP schema and query it
for information regarding supported objectclasses, attributes and syntaxes.

=head1 METHODS

Where a method is stated as taking the 'name or OID' of a schema item (which
may be an object class, attribute or syntax) then a case-insensitive name
or raw OID (object identifier, in dotted numeric string form, e.g. 2.5.4.0)
may be supplied.

Each returned item of schema (e.g. an attribute definition) is returned
in a HASH. The keys in the returned HASH are lowercase versions of
the keys read from the server. Here's a partial list (not all HASHes
define all keys) although note that RFC 4512 permits other keys as
well:

 name
 desc
 obsolete
 sup
 equality
 ordering
 substr
 syntax
 single-value
 collective
 no-user-modification
 usage
 abstract
 structural
 auxiliary
 must
 may
 applies
 aux
 not
 oc
 form

=over 4

=item all_attributes ( )

=item all_ditcontentrules ( )

=item all_ditstructurerules ( )

=item all_matchingrules ( )

=item all_matchingruleuses ( )

=item all_nameforms ( )

=item all_objectclasses ( )

=item all_syntaxes ( )

Returns a list of all the requested types in the schema.

=item attribute ( NAME )

=item ditcontentrule ( NAME )

=item ditstructurerule ( NAME )

=item matchingrule ( NAME )

=item matchingruleuse ( NAME )

=item nameform ( NAME )

=item objectclass ( NAME )

=item syntax ( NAME )

Returns a reference to a hash, or C<undef> if the schema item does not
exist. C<NAME> can be a name or an OID.

 $attr_href = $schema->attribute( "attrname" );

=item dump ( )

Dump the raw schema information to standard out.

=item dump ( FILENAME )

Dump the raw schema information to a file.

 $result = $schema->dump ( "./schema.dump" );

If no schema data is returned from directory server, the method will
return undefined.  Otherwise a value of 1 is always returned.

=item error ( )

Returns the last error encountered when parsing the schema.

=item may ( OBJECTCLASS )

Given an argument which is the name or OID of a known object class,
returns a list of HASHes describing the attributes which are optional
in the class.

  @may = $schema->may ( $oc );
  # First optional attr has the name '$may[0]->{name}'

=item must ( OBJECTCLASS )

Given an argument which is the name or OID of a known object class,
returns a list of HASHes describing the attributes which are mandatory
in the class.

  @must = $schema->must ( $oc );

=item parse ( MESG )

=item parse ( ENTRY )

=item parse ( FILENAME )

Takes a single argument which can be any of, a message object returned
from an LDAP search, a C<Net::LDAP::Entry> object or the name of a
file containing an LDIF form of the schema.

If the argument is a message result from a search,
C<Net::LDAP::Schema> will parse the schema from the first entry
returned.

Returns true on success and C<undef> on error.

=item superclass ( NAME )

Given an argument which is the name or OID of a known objectclass,
returns the list of names of the immediate superclasses.

=item attribute_syntax ( NAME )

Given an attribute name, return the actual syntax taking into account
attribute supertypes.

=item matchingrule_for_attribute ( NAME, RULE )

Given an attribute name and a matching rule (C<equality>,
C<substr>, etc), return the actual rule taking into account attribute
supertypes.

=back

=head1 SEE ALSO

L<Net::LDAP>,
L<Net::LDAP::RFC>

=head1 AUTHORS

Graham Barr E<lt>gbarr@pobox.comE<gt>
John Berthels E<lt>jjb@nexor.co.ukE<gt>

Please report any bugs, or post any suggestions, to the perl-ldap mailing list
E<lt>perl-ldap@perl.orgE<gt>.

=head1 COPYRIGHT

Copyright (c) 1998-2004 Graham Barr. All rights reserved. This program is
free software; you can redistribute it and/or modify it under the same
terms as Perl itself.

=cut