Ok, I narrowed it down to a very small test case. The mymodule.jl file is
at the bottom of this posting. If you save that to a file then run this
code, you'll get the same effect as my original problem except with the
'index' method.
using mymodule
mydf = MyDataFrame(Any[], Index())
# This line complains that `index` has no method matching
index(::MyDataFrame)
display(mydf)
# This displays my `index` method
methods(index)
# This shows that my `index` method works
index(mydf)
=== mymodule.jl ===
module mymodule
import DataFrames: AbstractDataFrame, DataFrame, Index, nrow, ncol
import DataArrays: DataArray
export MyDataFrame, nrow, ncol, Index, index, columns
type MyDataFrame <: AbstractDataFrame
columns::Vector{Any}
colindex::Index
function MyDataFrame(columns::Vector{Any}, colindex::Index)
ncols = length(columns)
if ncols > 1
nrows = length(columns[1])
equallengths = true
for i in 2:ncols
equallengths &= length(columns[i]) == nrows
end
if !equallengths
msg = "All columns in a DataFrame must be the same length"
throw(ArgumentError(msg))
end
end
if length(colindex) != ncols
msg = "Columns and column index must be the same length"
throw(ArgumentError(msg))
end
new(columns, colindex)
end
end
index(df::MyDataFrame) = df.colindex
columns(df::MyDataFrame) = df.columns
nrow(df::MyDataFrame) = ncol(df) > 0 ? length(df.columns[1])::Int : 0
ncol(df::MyDataFrame) = length(index(df))
end
==================