# Encapsulating enum access via dot syntax

**URL:** https://discourse.julialang.org/t/encapsulating-enum-access-via-dot-syntax/11785
**Category:** General Usage
**Tags:** enum
**Created:** [June 19, 2018, 3:08pm UTC](https://discourse.julialang.org/t/encapsulating-enum-access-via-dot-syntax/11785 "2018-06-19T15:08:31Z")
**Posts on this page:** 1
**Showing post:** 4

<div class="post-metadata">

### Author: ![quinnj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/quinnj/32/11_2.png) [@quinnj](https://discourse.julialang.org/u/quinnj)
#### Post date: [June 19, 2018, 3:33pm UTC](https://discourse.julialang.org/t/encapsulating-enum-access-via-dot-syntax/11785/4 "2018-06-19T15:33:51Z")

</div>

Here’s a macro I’ve thrown together and use in a few projects:

```julia
macro scopedenum(T, args...)
    defs = Expr(:block)
    append!(defs.args, collect(:(const $(x.args[1]) = Enum($(x.args[2]))) for x in args))
    names = Dict(x.args[2]=>String(x.args[1]) for x in args)
    str2val = Dict(String(x.args[1])=>x.args[2] for x in args)
    push!(defs.args, quote
        function name(e::Enum)
            nms = $names
            return nms[e.value]
        end
        Enum(str::String) = Enum($(str2val)[str])
        Base.show(io::IO, e::E) where {E <: Enum} = print(io, "$(Base.datatype_module(E)).$(name(e)) = $(e.value)")
    end)
    blk = esc(:(module $T; struct Enum{T}; value::T; end; Enum{T}(e::Enum{T}) where {T} = e; $defs; end))
    return Expr(:toplevel, blk)
end

```

The basic usage is

```julia
@scopedenum Fruit APPLE=1 PEAR=2 BANANA=3
Fruit.APPLE
Fruit.PEAR
# access enum value
Fruit.APPLE.value
# make an APPLE from string
Fruit.Enum("APPLE")
# restricting type signatures
f(x::Fruit.Enum) = # do stuff w/ x

```

---

_[View the full topic](https://discourse.julialang.org/t/encapsulating-enum-access-via-dot-syntax/11785)._
