# How to intercept module variable getting and setting in Julia 1.8 similar to getproperty and setproperty! for structures?

**URL:** <https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026>\
**Category:** General Usage\
**Created:** [April 3, 2023, 6:55pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026 "2023-04-03T18:55:44Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![andrey2185](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andrey2185/32/9889_2.png) [@andrey2185](https://discourse.julialang.org/u/andrey2185)\
**Post date:** [April 3, 2023, 6:55pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/1 "2023-04-03T18:55:44Z")

</div>

Please help, how to intercept get and set variable of module in Julia 1.8 ?

```julia
julia> module M end;

julia> # in julia 1.9 i can do this:
julia> function Base.setproperty!(m::Module, p::Symbol, v)
           println("variable $p changed on $v in module $m")
           return setglobal!(m, p, v)
       end;

julia> # what about julia 1.8 ?

julia> M.x = 1;
variable x changed on 1 in module Main.M

```

---

<div class="post-metadata">

**Author:** ![lmiq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/lmiq/32/18314_2.png) [@lmiq](https://discourse.julialang.org/u/lmiq)\
**Post date:** [April 3, 2023, 7:32pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/2 "2023-04-03T19:32:11Z")

</div>

That looks like a XY question, but:

```julia
julia> module M 
           x = 2
       end

julia> using .M

julia> M.x
2

julia> M.x = 1
1

julia> M.x
1

```

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [April 3, 2023, 7:36pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/3 "2023-04-03T19:36:03Z")

</div>

Could you tell us more about what you are trying to do overall?

```julia
julia> module M end;

julia> M.x = 1
ERROR: cannot assign variables in other modules
Stacktrace:
 [1] setproperty!(x::Module, f::Symbol, v::Int64)
   @ Base .\Base.jl:32
 [2] top-level scope
   @ REPL[2]:1

julia> @eval M x = 1
1

julia> M.x
1

```

---

<div class="post-metadata">

**Author:** ![andrey2185](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andrey2185/32/9889_2.png) [@andrey2185](https://discourse.julialang.org/u/andrey2185)\
**Post date:** [April 3, 2023, 7:36pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/4 "2023-04-03T19:36:17Z")

</div>

oh sorry, my english is bad)

i need to override this as getproperty() and setproperty!() for structs

---

<div class="post-metadata">

**Author:** ![mkitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mkitti/32/12459_2.png) [@mkitti](https://discourse.julialang.org/u/mkitti)\
**Post date:** [April 3, 2023, 7:40pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/5 "2023-04-03T19:40:53Z")

</div>

```julia
julia> mutable struct Foo
           x::Int
       end

julia> import Base: setproperty!, getproperty

julia> setproperty!(value::Foo, name::Symbol, x) = setfield!(value, name, x*2)
setproperty! (generic function with 12 methods)

julia> foo = Foo(0)
Foo(0)

julia> foo.x = 5
5

julia> foo.x
10

julia> getproperty(value::Foo, symbol::Symbol) = symbol == :y ? 1 : getfield(value, symbol)
getproperty (generic function with 50 methods)

julia> foo.x
10

julia> foo.y
1

```

---

<div class="post-metadata">

**Author:** ![andrey2185](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andrey2185/32/9889_2.png) [@andrey2185](https://discourse.julialang.org/u/andrey2185)\
**Post date:** [April 3, 2023, 7:44pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/6 "2023-04-03T19:44:35Z")

</div>

thanks, but instead of Foo there must be module M

---

<div class="post-metadata">

**Author:** ![andrey2185](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/andrey2185/32/9889_2.png) [@andrey2185](https://discourse.julialang.org/u/andrey2185)\
**Post date:** [April 3, 2023, 8:16pm UTC](https://discourse.julialang.org/t/how-to-intercept-module-variable-getting-and-setting-in-julia-1-8-similar-to-getproperty-and-setproperty-for-structures/97026/7 "2023-04-03T20:16:08Z")

</div>

sorry for my english,

this is a solution:

```julia
function Base.setproperty!(m::Module, p::Symbol, v)
    println("variable $p changed on $v in module $m")
    @eval m $p = $v # waiting for julia 1.9 and will use setglobal!()
end;

```
