NAME
   Hash::DefHash - Manipulate defhash

VERSION
   This document describes version 0.071 of Hash::DefHash (from Perl
   distribution Hash-DefHash), released on 2020-01-04.

SYNOPSIS
    use Hash::DefHash; # imports defhash()

    # create a new defhash object, die when hash is invalid defhash
    $dh = Hash::DefHash->new;                        # creates an empty defhash
    $dh = Hash::DefHash->new({a=>1});                # use the hashref
    $dh = Hash::DefHash->new({"contains space"=>1}); # dies!

    # defhash() is a synonym for Hash::DefHash->new().
    $dh = defhash({foo=>1});

    # return the original hash
    $hash = $dh->hash;

    # list properties
    @props = $dh->props;

    # list property names, values, and attributes, will return ($prop => $attrs,
    # ...). Property values will be put in $attrs with key "". For example:
    %content = DefHash::Hash->new({p1=>1, "p1.a"=>2, p2=>3})->contents;
    # => (p1 => {""=>1, a=>2}, p2=>3)

    # get property value, will die if property does not exist
    $propval = $dh->prop($prop);

    # like prop(), but will return undef if property does not exist
    $propval = $dh->get_prop($prop);

    # check whether property exists
    say "exists" if $dh->prop_exists($prop);

    # add a new property, will die if property already exists
    $dh->add_prop($prop, $propval);

    # add new property, or set value for existing property
    $oldpropval = $dh->set_prop($prop, $propval);

    # delete property, noop if property already does not exist. set $delattrs to
    # true to delete all property's attributes.
    $oldpropval = $dh->del_prop($prop, $delattrs);

    # delete all properties, set $delattrs to true to delete all properties's
    # attributes too.
    $dh->del_all_props($delattrs);

    # get property's attributes. to list defhash attributes, set $prop to undef or
    # ""
    %attrs = $dh->attrs($prop);

    # get attribute value, will die if attribute does not exist
    $attrval = $dh->attr($prop, $attr);

    # like attr(), but will return undef if attribute does not exist
    $attrval = $dh->get_attr($prop, $attr);

    # check whether an attribute exists
    @attrs = $dh->attr_exists($prop, $attr);

    # add attribute to a property, will die if attribute already exists
    $dh->add_attr($prop, $attr, $attrval);

    # add attribute to a property, or set value of existing attribute
    $oldatrrval = $dh->set_attr($prop, $attr, $attrval);

    # delete property's attribute, noop if attribute already does not exist
    $oldattrval = $dh->del_attr($prop, $attr, $attrval);

    # delete all attributes of a property
    $dh->del_all_attrs($prop);

    # get predefined properties
    say $dh->v;            # shortcut for $dh->get_prop('v')
    say $dh->default_lang; # shortcut for $dh->get_prop('default_lang')
    say $dh->name;         # shortcut for $dh->get_prop('name')
    say $dh->summary;      # shortcut for $dh->get_prop('summary')
    say $dh->description;  # shortcut for $dh->get_prop('description')
    say $dh->tags;         # shortcut for $dh->get_prop('tags')

    # get value in alternate languages
    $propval = $dh->get_prop_lang($prop, $lang);

    # get value in all available languages, result is a hash mapping lang => val
    %vals = $dh->get_prop_all_langs($prop);

    # set value for alternative language
    $oldpropval = $dh->set_prop_lang($prop, $lang, $propval);

FUNCTIONS
 defhash([ $hash ]) => OBJ
   Shortcut for "Hash::DefHash->new($hash)". As a bonus, can also detect if
   $hash is already a defhash and returns it immediately instead of
   wrapping it again. Exported by default.

METHODS
 new
   Usage:

    $dh = Hash::DefHash->new([ $hash ],[ %opts ]);

   Constructor. Create a new Hash::DefHash object, which is a thin OO skin
   over the regular Perl hash. If $hash is not specified, a new anonymous
   hash is created.

   Internally, the object contains a hash reference which contains
   reference to the hash ("bless({hash=>$orig_hash, ...},
   'Hash::DefHash')"). It does not create a copy of the hash or bless the
   hash directly. Be careful not to assume that the two are the same!

   Will check the keys of hash for invalid properties/attributes and will
   die if one is found, e.g..

    $dh = Hash::DefHash->new({"contains space" => 1}); # dies!

   Known options:

   *   check => BOOL (default: 1)

       Whether to check that hash is a valid defhash. Will die if hash
       turns out to contain invalid keys/values.

   *   parent => HASH/DEFHASH_OBJ

       Set defhash's parent. Default language ("default_lang") will follow
       parent's if unset in the current hash.

 hash
   Usage:

    $hashref = $dh->hash;

   Return the original hashref.

 check
   Usage:

    $dh->check;

 contents
   Usage:

    my %contents = $dh->contents;

 default_lang
   Usage:

    $default_lang = $dh->default_lang;

 props
   Usage:

    @props = $dh->props;

   Return list of properties. Will ignore properties that begin with
   underscore, e.g.:

    $dh = defhash({a=>1, _b=>2});
    $dh->props;

 prop
   Usage:

    $val = $dh->prop($name);

   Get property value, will die if property does not exist.

 get_prop
    $val = $dh->get_prop($name);

   Like "prop"(), but will return undef if property does not exist.

 prop_exists
   Usage:

    $exists = $dh->prop_exists;

 add_prop
 set_prop
 del_prop
 del_all_props
 attrs
 attr
 get_attr
 attr_exists
 add_attr
 set_attr
 del_attr
 del_all_attrs
 defhash_v
 v
 name
 summary
 description
 tags
 get_prop_lang
 get_prop_all_langs
 set_prop_lang
HOMEPAGE
   Please visit the project's homepage at
   <https://metacpan.org/release/Hash-DefHash>.

SOURCE
   Source repository is at
   <https://github.com/perlancar/perl-Hash-DefHash>.

BUGS
   Please report any bugs or feature requests on the bugtracker website
   <https://rt.cpan.org/Public/Dist/Display.html?Name=Hash-DefHash>

   When submitting a bug or request, please include a test-file or a patch
   to an existing test-file that illustrates the bug or desired feature.

SEE ALSO
   DefHash specification

AUTHOR
   perlancar <[email protected]>

COPYRIGHT AND LICENSE
   This software is copyright (c) 2020, 2018, 2016, 2015, 2014, 2012 by
   [email protected].

   This is free software; you can redistribute it and/or modify it under
   the same terms as the Perl 5 programming language system itself.